package cn.piesat.scanning.service;

import cn.piesat.scanning.business.dq1043.vo.MetaDataInDbVO;
import cn.piesat.scanning.dto.DbDmsSchedulerTaskFileRecordDTO;

import java.io.File;
import java.util.List;
import java.util.Map;
import java.util.Set;

public interface DbDmsSchedulerTaskFileRecordService {

    /**
     *  根据文件集合 准备数据阶段记录
     * @param taskId 任务Id
     * @param fileList 符合规范文件集合
     */
    void prepareDataByFileList(String taskId, List<File> fileList);

    /**
     * 根据文件名称 准备数据阶段记录
     * @param taskId
     * @param fileName
     */
    DbDmsSchedulerTaskFileRecordDTO prepareDataByFileName(String taskId, String fileName,String taskPlanId);

    /**
     * 根据文件名称 准备数据阶段记录
     * @param taskId
     * @param fileName
     */
    DbDmsSchedulerTaskFileRecordDTO prepareDataByFileName(String taskPlanId,String taskId, String fileName, int incrWait);

    /**
     * 根据文件名称集合 准备数据阶段记录
     * @param taskId 任务Id
     * @param fileNameList 符合规范文件集合
     */
    void prepareDataByFileNameList(String taskId, List<String> fileNameList);

    void prepareDataByFileNameList(String taskId, List<String> fileNameList, Map<String, MetaDataInDbVO> distinctRecordMap);

    /**
     * 数据执行
     * @param taskId 任务Id
     * @param fileName 文件名称
     */
    void dataExecution(String taskId,String fileName);

    /**
     * 批量数据执行
     * @param taskId 任务Id
     * @param fileNames 文件名称集合
     */
    void dataExecutionBatch(String taskId, List<String> fileNames);

    /**
     * 数据执行，存在重复文件名
     * @param taskId
     * @param fileName
     */
    void dataRepeatExecution(String taskId,String fileName);

    /**
     * 数据结果记录
     * @param taskId 任务Id
     * @param fileName 文件名称
     * @param resultStatus 状态
     */
    void dataResults(String taskId, String fileName, boolean resultStatus);

    /**
     * 批量数据结果记录
     * @param taskId 任务Id
     * @param fileNames 文件名称集合
     * @param resultStatus 状态
     */
    void dataResultsBatch(String taskId, List<String> fileNames, boolean resultStatus);

    /**
     * 数据结果记录（存在重复数据）
     * @param taskId
     * @param fileName
     * @param resultStatus
     */
    void dataRepeatResults(String taskId, String fileName, boolean resultStatus);

    /**
     * 根据记录Id查询信息
     * @param id 记录ID
     * @return
     */
    DbDmsSchedulerTaskFileRecordDTO findById(String id);

    /**
     * 数据重做
     * @param taskFileRecordDTO 任务执行记录对象
     */
    void dataRedo(DbDmsSchedulerTaskFileRecordDTO taskFileRecordDTO);

    /**
     * 添加实体类
     * @param dto
     */
    void save(DbDmsSchedulerTaskFileRecordDTO dto);

    /**
     * 重做时修改状态，删除失败的状态，重新归置为等待状态
     * @param taskId
     * @param fileNameList
     */
    void redoDataStatus(String taskId,List<String> fileNameList);

    /**
     * 根据任务ID和文件名称删除
     * @param taskId
     * @param fileName
     */
    void deleteByTaskIdAndFileName(String taskId, String fileName);

    /**
     * 根据文件名称和任务ID查询
     * @param taskId 任务ID
     * @param fileName 文件名称
     * @return
     */
    DbDmsSchedulerTaskFileRecordDTO findByTaskIdAndFileName(String taskId, String fileName);

    /**
     * 根据任务ID和文件名称列表查询
     * @param taskId 任务ID
     * @param fileNameList 文件名称集合
     * @return
     */
    List<DbDmsSchedulerTaskFileRecordDTO> findAllByTaskIdAndFileNameIn(String taskId, List<String> fileNameList);

    List<String> findFileNameListByTaskId(String taskId);

    /**
     * 通过任务ID查询任务记录集合
     * @param taskId 任务ID
     * @return
     */
    List<DbDmsSchedulerTaskFileRecordDTO> findByTaskId(String taskId);

    /**
     * 查找需要重做的文件
     * @param taskId
     * @return
     */
    List<DbDmsSchedulerTaskFileRecordDTO> findRedoTasks(String taskId);

    Set<String> listByTaskId(String taskId);

    void deleteByTaskPlanIdIn(List<String> taskPlanIds);

    List<DbDmsSchedulerTaskFileRecordDTO> findByFileNameList(List<String> execFileNameList,String taskId);

    void updateTaskPlanIdByTaskIdAndFileName(String taskId,String fileName, String taskPlanId);

    List<DbDmsSchedulerTaskFileRecordDTO> findByTaskPlanIdAndStateNot(String taskPlanId,int state);

    List<DbDmsSchedulerTaskFileRecordDTO> findByFileNameLikeAndStateLessThan(String fileDateBei, int state);

    void deleteByFileNameLikeAndTaskPlanIdNotNull(String fileDateBei);

    void deleteByFileNameIn(List<String> l0FileNameList);

    List<DbDmsSchedulerTaskFileRecordDTO> findByTaskIdAndFileNameIn(String id, List<String> allNameList);
}
